動的ポートマッピング利用時に EC2 のヘルスチェックが失敗する
こんにちは! AWS 事業本部コンサルティング部のたかくに(@takakuni_)です。
今回は、 ALB + ECS で利用される動的ポートマッピング利用時にターゲットグループのヘルスチェックが失敗するケースを考えていきたいと思います。
動的ポートマッピングとは
動的ポートマッピングとは、ELB + ECS 間で利用されるホストポート(トラフィックポート)を動的に採番し、ポートの重複を避けて疎通を行う方法です。詳細は以下をご覧ください。
では、ALB と ターゲットグループ(ECS)のヘルスチェックに失敗するパターンを考えていきます。
EC2 のセキュリティグループをチェック
動的ポートマッピングでは、一時ポートが利用されます。 EC2 のセキュリティグループが ALB のセキュリティグループからのインバウンドを一時ポートで許可しているか確認してみてください。マネジメントコンソールでみると以下のようなイメージで、一時ポートが利用されて、「Request timed out」になっている部分が特徴的です。
ちなみに、動的ポートマッピングで使用されるホストポートは、コンテナインスタンスの一時ポート範囲とDockerのバージョンから動的に選択されます。Docker バージョン 1.6.0 以降のデフォルトの一時ポート範囲は、EC2 インスタンスの /proc/sys/net/ipv4/ip_local_port_range
に記載されています。
sh-4.2$ cat /proc/sys/net/ipv4/ip_local_port_range 32768 60999 sh-4.2$
AWS::ECS::TaskDefinition PortMapping hostPort
一時ポート以外のヘルスチェックが行われ失敗する
一時ポート以外のヘルスチェックでヘルスチェックが行われ、ヘルスチェックに失敗している場合は 2 パターン考えられます。
traffic-port でヘルスチェックが行われていない
厳密に言えば、ヘルスチェックに失敗しているわけではないのですが、タスクが起動してこないケースの原因として、ターゲットグループで利用するヘルスチェック用のポートが traffic-port
に設定されてない場合が考えられます。
マネジメントコンソールだと、以下のようにターゲットが登録されていない(登録済みターゲットが 0 の状態)になります。
この場合、ターゲットグループのポートが固定化されていないか確認します。
動的ポートマッピング利用時において、あるべき姿は「トラフィックポート」になります。
AutoScaling Group 側でも管理している
少し特殊ですが、 AutoScaling Group 側でも EC2 をターゲット登録してしまった場合、動的ポートマッピングとは別に、ターゲットグループ作成時に設定したポート番号でヘルスチェックが行われます。
ほとんどのケースの場合、ポート開放していないため、Application AutoScaling (ECS) のヘルスチェックは Healty だが、EC2 AutoScaling のヘルスチェックは Unhealty のような挙動を取ります。
EC2 AutoScaling の設定は不要のため、 AutoScaling Group 編集画面で ELB (ターゲットグループ) の紐付けを外してあげましょう。
まとめ
以上、「動的ポートマッピングを構築した時に EC2 のヘルスチェックが失敗する」でした。
私は最後の「AutoScaling Group 側でも管理している」に引っかかり、かなり詰まったのでブログにしてみました。
どなたかの参考になれば幸いです。
AWS 事業本部コンサルティング部のたかくに(@takakuni_)でした!